import { defineStore } from "pinia";

import { loginApi } from "@/api/user";

interface LoginParams {
    username: string;
    password: string
}



//用户模块的pinia
export const useUserStore = defineStore("user",{
     
    //1.这个是user的store中定义的数据(定义数据,然后在actions中请求接口获取到数据之后,然后修改数据,再放置到本地缓存中)
    state:()=>({
         token: sessionStorage.getItem("token") || "",
         roles:sessionStorage.getItem("roles") ? JSON.parse(sessionStorage.getItem("roles")!) : [],   //这些在Pinia中定义的数据,其实在下面的actions中定义了，为什么还要从sessionStorage中取呢？因为在Pinia中存储的数据刷新之后就没有了， 所以在actions定义数据之后,也会存一份在sessionStorage中，这样在pinia中取不到的化就再取从本地存储中取。
         username:sessionStorage.getItem("username") || "",
         menu:sessionStorage.getItem("menu") ? JSON.parse(sessionStorage.getItem("menu")!) : []
    }),

    //2.修改pinia中的数据
    actions:{
         //2.1 登录修改pinia中用户的数据
         async login(data: LoginParams) {
            //2.2 直接解构赋值(解构出来的数据就可以直接使用,不需要在使用对象.属性。)
            try{//2.3 这个地方为什么要使用try{}catch(error){}
                  const {data: { token, user: { username, roles }, menulist } }=await loginApi(data);
                  this.token=token;
                  this.roles=roles;
                  this.menu=menulist;
                  this.username=username

                  sessionStorage.setItem("token", token)
                  sessionStorage.setItem("roles", JSON.stringify(roles))
                  sessionStorage.setItem("username", username)
                  sessionStorage.setItem("menu", JSON.stringify(menulist))
            }catch(error){
                console.error("error",error);
            }
        },
        logout() {
            this.token=""
            this.roles=[];
            this.username=""
            this.menu=[];
            sessionStorage.clear()

        }
    }
})